package Day011_多线程1.demo03_高并发及线程安全.线程安全;

/**
 * @author zhangyan
 * @date 2020/4/28 11:30
 */
public class demo01_多线程可见性问题 {
    public static void main(String[] args) {
        //创建子线程
        MyThread mt = new MyThread();
        mt.start();
        //主线程
        while (true){
            /*
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            System.out.println("--------");
            */
            if (MyThread.flag == true){
                System.out.println("死循环结束");
                break;
            }
        }
        /*
        由于while是非常简单的代码,执行非常快,
        所以主线程来不及去方法区中获取flag的最新值,
        主线程一直使用最初拷贝的flag=false

        加个费时代码 就可以结束循环
        */
    }
}
/*
    猜测结果:子线程把共享便利flag改为true,打印语句,并且break死循环结束
    实际结果:子线程把共享便利flag改为true,但主线程依旧死循环

    因为: 子线程对共享变量flag修改后的值,对于主线程是不可见的
 */

class MyThread extends Thread{
    static boolean flag = false; //主线程 子线程共享的变量

    @Override
    public void run() {
        try {
            Thread.sleep(3000); //暂停
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //如果不睡面很快就执行了.
        flag = true;
        System.out.println("flag修改后的值:" + flag);
    }
}